package com.tdam2013.grupo09.funcionalidad;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import com.tdam2013.grupo09.BD.BD;
import com.tdam2013.grupo09.entidades.Mensaje;
import com.tdam2013.grupo09.entidades.RespuestaServidor;
import com.tdam2013.grupo09.entidades.UsuarioLogueado;
import com.tdam2013.grupo09.mapas.Mapa;
import com.tdam2013.grupo09.parsing.ConversorXMLMensaje;
import com.tdam2013.grupo09.parsing.RespuestaParseSax;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;

public class Accion {

	public static RespuestaServidor respuesta;
	static boolean bandera;	
	static BD bd = new BD(Aplicacion.getAppContext());	

	public static void llamar(String tel, String nombre, Context contexto) {
		Intent intent = new Intent(Intent.ACTION_CALL);
		intent.setData(Uri.parse("tel:" + tel));
		contexto.startActivity(intent);		
		bd.registrarAccionEnHistorial(nombre, "1");
	}

	public static void enviarSMS(String tel, String nombre, Context contexto) {
		Intent intent = new Intent(Intent.ACTION_SENDTO);
		intent.setData(Uri.parse("smsto:" + tel));
		contexto.startActivity(intent);
		bd.registrarAccionEnHistorial(nombre, "2");
	}

	public static void enviarMail(String email, String nombre, Context contexto) {
		Intent emailIntent = new Intent(Intent.ACTION_SEND);
		emailIntent.setData(Uri.parse("mailto:" + email));
		emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { email });
		emailIntent.setType("text/html");
		contexto.startActivity(Intent.createChooser(emailIntent,"Elija un mail:"));
		bd.registrarAccionEnHistorial(nombre, "3");
	}

	public static void verUbicacion(Context contexto) {
		contexto.startActivity(new Intent(contexto, Mapa.class));
	}

	/**
	 * @param mje
	 * @param contexto
	 * @return RespuestaServidor
	 * Envia el mensaje web al servidor.
	 */
	public static RespuestaServidor enviarMensajeWeb(Mensaje mje,Context contexto) {
		ConversorXMLMensaje xml = new ConversorXMLMensaje();
		xml.convertirEnviarMensaje(mje, contexto);
		String path = "/data/data/com.tdam2013.grupo09/files/MensajeEnviado.xml";
		return conectarYobtenerRespuesta(path);				
	}

	/**
	 * @param user
	 * @param contexto
	 * @return RespuestaServidor
	 * Registrar un usuario web en el servidor 
	 */
	public static RespuestaServidor registrarUsuario(UsuarioLogueado user,Context contexto) {
		ConversorXMLMensaje xml = new ConversorXMLMensaje();
		xml.convertirRegistrarUsuario(user, contexto);
		String path = "/data/data/com.tdam2013.grupo09/files/RegistroUsuario.xml";
		return conectarYobtenerRespuesta(path);
	}	

	/**
	 * @param user
	 * @param fechaUltimoMensaje
	 * @param contexto
	 * @return RespuestaServidor
	 * Obtiene un mensaje web desde el servidor
	 */
	public static RespuestaServidor obtenerMensajes(UsuarioLogueado user,String fechaUltimoMensaje, Context contexto) {
		ConversorXMLMensaje xml = new ConversorXMLMensaje();
		xml.convertirObtenerMensajes(user, fechaUltimoMensaje, contexto);		
		String path = "/data/data/com.tdam2013.grupo09/files/ObtenerMensajes.xml";
		return conectarYobtenerRespuesta(path);
	}

	/**
	 * @param out
	 * @param path
	 * Escribe caracteres en un archivo pasado por parametro.
	 */
	private static void escribirDatos(OutputStreamWriter out, String path) {
		try {
			BufferedReader in = new BufferedReader(new FileReader(path));
			String str;
			while ((str = in.readLine()) != null) {
				out.write(str);
			}
			in.close();
		} 
		catch (IOException e) {
		}
	}

	/**
	 * @param path
	 * @return RespuestaServidor
	 * Realiza la conexion al servidor y devuelve una respuesta.
	 */
	private static RespuestaServidor conectarYobtenerRespuesta(final String path) {
		new Thread(new Runnable() {

			@Override
			public void run() {
				try {
					URL u = new URL("http://192.168.1.103:8080/MessageSender/");					
					URLConnection c = u.openConnection();

					c.setDoOutput(true);
					if (c instanceof HttpURLConnection) {
						((HttpURLConnection) c).setRequestMethod("POST");
					}
					OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
					escribirDatos(out, path);
					out.close();

					BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));

					String s = null;
					StringBuffer resp = new StringBuffer();
					while ((s = in.readLine()) != null) {
						resp.append(s);
					}
					RespuestaParseSax r = new RespuestaParseSax(new ByteArrayInputStream(resp.toString().getBytes()));
					respuesta = r.parse();
					bandera = true;
					in.close();
				} 
				catch (IOException e) {					
				}
			}
		}).start();
		while (bandera == false) {
		}
		return respuesta;
	}
	
	/**
	 * Obtiene la fecha actual
	 * @return fechaActual
	 */
	public static String getfechaActual() {
		Calendar c = Calendar.getInstance();
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		formato.setTimeZone(TimeZone.getTimeZone("GMT-3"));
		String fechaActual = formato.format(c.getTime());
		return fechaActual;
	}

}
